//MD5是一种常用的哈希算法,用于给任意数据签名。这个签名通常用一个十六进制的字符串表示
const crypto1 = require('crypto');
const md5 = crypto1.createHash('md5');//如果要计算SHA1,只需要把'MD5'换成'sha1',还可以使用更安全的sha256和sha512
//可以任意多次调用update()
md5.update("helloworld");//update()方法默认字符串编码为UTF-8,也可以传入Buffer
md5.update("shenyiguang");

console.log(md5.digest('hex'));//digest()方法不传参数表示以二进制输出,传参'hex'表示以十六进制输出

//-------------------------------------------------------------------------------------------//

//Hmac也是一种哈希算法,利用MD5或SHA1等哈希算法,不同的是,Hmac需要一个密钥
const crypto2 = require('crypto');
const hmac = crypto2.createHmac("sha256","secret-key");//secret-key:是密钥,只要密钥发生了变化签名也会变化。Hmac是随机数增强的哈希算法
hmac.update("helloworld");
hmac.update("shenyiguang");
console.log(hmac);
console.log(hmac.digest('hex'));//加密结果通常有两种表示方法:hex 和base64

//-------------------------------------------------------------------------------------------//

//aes是一种对称加密算法,加解密都用同一个密钥
const crypto3 = require('crypto');

function aesEncrypt(data,key) {
	const cipher = crypto3.createCipher('aes192',key);
	var crypted = cipher.update(data,'utf8','hex');
	crypted += cipher.final('hex');
	return crypted;
}

function aesDecrypt(encryptStr,key){
	const decipher = crypto3.createDecipher('aes192',key);
	var deciphed = decipher.update(encryptStr,'hex','utf8');
	deciphed += decipher.final('utf8');
	return deciphed;
}

var data = "hello,this is a secret message";
var key = "passwordkey";
var encrypted = aesEncrypt(data,key);
var decrypted = aesDecrypt(encrypted,key);

console.log("plain text="+data);
console.log("Encrypted text="+encrypted);
console.log("Decrypted text="+decrypted);

//-------------------------------------------------------------------------------------------//

// RSA(廖雪峰nodejs教程)
// 在命令行执行以下命令以生成一个RSA密钥对：
// openssl genrsa -aes256 -out rsa-key.pem 2048